package com.winkyle.woodenfish.util;

import java.util.concurrent.TimeUnit;

import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;

/**
 * @author winkyle
 * @date 2018/06/14
 * @description 基于rxJava用于计时的类
 */

public class RxCountDownUtil {

    /**
     * @description 每间隔一秒发送一次数据
     * @return 一个每隔一秒发送一次数据的被观察者
     */
    public static Observable<Long> getTimeObservable() {
        return Observable.interval(0, 1, TimeUnit.SECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }

    /**
     * @description 正计时
     * @return 一个无时间限制的正计时的被观察者
     */
    public static Observable<Integer> isTiming() {
        final int countTime = 1;
        return  getTimeObservable()
                .map(new Func1<Long, Integer>() {
                    @Override
                    public Integer call(Long increaseTime) {
                        return increaseTime.intValue();
                    }
                });
    }

    /**
     * @description 正计时
     * @param time 总时长
     * @return 一个有时间限制的正计时的被观察者
     */
    public static Observable<Integer> isTiming(int time) {
        if (time < 1) time = 1;
        final int countTime = time;
        return  isTiming()
                .take(countTime + 1);
    }

    /**
     * @description 倒计时
     * @param time 总时长
     * @return 一个有时间限制的倒计时的被观察者
     */
    public static Observable<Integer> countdown(int time) {
        if (time < 1) time = 1;
        final int countTime = time;
        return  getTimeObservable()
                .map(new Func1<Long, Integer>() {
                    @Override
                    public Integer call(Long increaseTime) {
                        return countTime - increaseTime.intValue();
                    }
                })
                .take(countTime + 1);
    }
}
